package com.secxiot.provider.task.service;

import com.secxiot.common.exception.BaseException;
import com.secxiot.provider.task.dto.TaskDto;
import com.secxiot.provider.task.dto.TaskSosDto;
import com.secxiot.provider.task.dto.TaskTransferListDto;
import com.secxiot.provider.task.dto.TaskVisitDto;
import com.secxiot.provider.task.entity.TaskAttributeTempDeptValue;
import com.secxiot.provider.task.entity.TaskExecution;
import com.secxiot.provider.task.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.GetMapping;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface TaskService {
    /**
     * 获取用户给定时间段任务
     *
     * @param userId   用户id
     * @param pageNo   页码，0开始
     * @param pageSize 请求数量
     * @param since    开始时间
     * @param last     结束时间，不传默认到当前最新
     * @return
     */
    @GetMapping
    TaskHomeVo listUnfinishedByUserIdAndTime(Long userId, Long pageNo, Long pageSize, Date since, Date last);

    /**
     * 发布任务
     *
     * @param taskDto 任务内容
     * @return
     */
    Long publish(TaskDto taskDto);

    /**
     * 发布交接任务
     *
     * @param taskTransferListDto 交接任务内容
     * @return 任务id
     */
    Long publishTransfer(TaskTransferListDto taskTransferListDto);

    /**
     * 获取部门的模版数据
     *
     * @param deptId 部门id
     * @return list 部门模板
     */
    List<TaskAttributeTempDeptValue> TaskAttributeTempDeptValue(Long deptId);

    /**
     * 发布sos任务
     *
     * @param taskSosDto
     * @return
     */
    Long publishSosTask(TaskSosDto taskSosDto) throws BaseException;

    /**
     * 修改任务状态
     *
     * @param taskExecution
     * @return
     */
    int UpdateTaskUserPlace(TaskExecution taskExecution);

    /**
     * 根据id查询任务状态
     *
     * @param taskId 任务id
     * @param userId 用户id
     * @return
     * @throws BaseException 无任务
     */
    TaskStatusVo getStatusById(Long taskId, Long userId) throws BaseException;

    /**
     * 根据患者id查询SOS任务状态
     *
     * @param userId 患者id
     * @return
     * @throws BaseException 无任务
     */
    TaskSOSStatusVo getSOSTaskStatusByPatientId(Long userId, Long taskId) throws BaseException;

    /**
     * 发布出诊任务
     *
     * @param visitDto 出诊任务
     * @return
     */
    Long publishSosVisit(TaskVisitDto visitDto) throws BaseException;

    /**
     * 获取患者检测数据模版
     *
     * @param deptId 部门id
     * @return 患者检测数据模版列表
     */
    List<TaskTempVo> getTaskTemp(Long deptId);

    /**
     * 更新任务状态信息
     *
     * @param userId        用户id
     * @param taskId        任务id
     * @param confirmStatus 状态
     * @return 任务状态信息
     * @throws BaseException
     */
    TaskStatusUpdateVo updateStatus(Long userId, Long taskId, String confirmStatus) throws BaseException;

    /**
     * 推送任务发布的消息
     *
     * @return
     */
    Integer pushPublishNotice();

    /**
     * 获取已发布任务
     *
     * @param userId   用户id
     * @param pageNo   页码
     * @param pageSize 条数
     * @return 已发布任务列表
     */
    List<TaskDisplayVo> getPublishedList(Long userId, Long pageNo, Long pageSize);

    /**
     * 获取我的科室任务
     *
     * @param deptId   部门id
     * @param pageNo   页码
     * @param pageSize 条数
     * @return 我的科室任务列表
     */
    List<TaskDisplayVo> getDepartmentList(Long deptId, Long pageNo, Long pageSize);

    /**
     * 获取已发布任务:按任务类型区分
     *
     * @param userId   用户id
     * @param taskType 任务类型
     * @param pageNo   页码
     * @param pageSize 条数
     * @return 按任务类型区分的已发布任务列表
     */
    List<TaskDisplayVo> getReleasedList(Long userId, String taskType, Long pageNo, Long pageSize);

    TaskStatisticsVo getStatistics(Long userId, Long deptId, Integer year, Integer month);

    /**
     * 获取sos疾病列表
     *
     * @param userId
     * @return
     */
    List<SosDiseaseVo> getDisease(Long userId);

    /**
     * 获取已接收任务:按任务类型区分
     *
     * @param userId   用户id
     * @param taskType 任务类型
     * @param pageNo   页码
     * @param pageSize 条数
     * @return 已经接收的各种任务类型的列表
     */
    List<TaskDisplayVo> getReceivedList(Long userId, String taskType, Long pageNo, Long pageSize);

    /**
     * 获取任务统计数据
     *
     * @param type     搜索类型(1:接收; 2:发布)
     * @param userId   用户ID
     * @param dateTime 时间节点
     * @return
     */
    TaskCountResultVo getTaskCountResultVo(Integer type, Long userId, Date dateTime);

    /**
     * 获取各种类型的最新一条任务
     *
     * @param userId   用户id
     * @param taskType 任务类型
     * @return 一条该类型的最新任务
     */
    TaskDisplayVo getNewestTask(Long userId, String taskType);

    /**
     * 首页按类型区分的最新任务、未确认数量
     *
     * @param userId 用户id
     * @return 各种类型的最新任务、未确认数量
     */
    TaskAndConfirmStatusVo getNewestTaskAndStatus(Long userId);

    /**
     * 搜索任务
     *
     * @param userId     用户id
     * @param searchName 发布人&内容 搜索
     * @param taskType   任务类型
     * @param type       搜索类型(1:接收; 2:发布)
     * @param pageNo     页码
     * @param pageSize   条数
     * @return
     */
    List<TaskDisplayVo> getSearchTaskList(Long userId, String searchName, String taskType, Integer type, Long pageNo, Long pageSize);

    /**
     * sos定时任务
     *
     * @return
     */
    void timeSosTask() throws BaseException;

    /**
     * 获取对应的sos任务ID
     *
     * @param taskId 出诊任务ID
     * @param userId
     * @return
     */
    Long getSosTaskId(Long taskId, Long userId);

    /**
     * sos 上报位置
     *
     * @param taskId
     * @param longitude
     * @param latitude
     */
    Long sosReportLocation(Long userId, Long taskId, BigDecimal longitude, BigDecimal latitude);

    /**
     * 获取医院救护车位置
     *
     * @param hospitalId 医院id
     * @return
     */
    List<SosPlatformVo> sosAmbulanceLocation(Long hospitalId);

    /**
     * 推送短信消息
     *
     * @return
     */
    void pushSMSNotice();

    /**
     * 获取车辆列表
     *
     * @return
     */
    List<RemindAmbulanceVo> getAmbulanceVoList(Long hospitalId);

    /**
     * 增加任务车辆记录
     *
     * @return
     */
    TaskStatusUpdateVo saveTaskAmbulance(Long userId, Long taskId, Long ambulanceId, String confirmStatus) throws BaseException;

    /**
     * 保存车辆位置信息
     *
     * @return
     */
    void saveAmbulancePosition() throws IOException;

    /**
     * 发送视频请求
     *
     * @param taskId 任务id
     * @return
     */
    int updateReportVideoTask(@Param(value = "taskId") Long taskId, @Param("userId") Long userId, @Param(value = "videoStatus") Integer videoStatus);
}
